/**
  * @file Point.h
  * @author Thibault Merle et Guillaume Poussel
  */
#ifndef _POINT_H_
#define _POINT_H_

#include <iostream>

/**
  * Type des coordonnées de chaque point.
  *
  * Cette définition permet une plus grande flexibilité du type de stockage
  * des points.
  */
typedef double p_type;
/**
  * Type de retour du produit en croix
  */
typedef double c_prod_type;

/**
  * @brief Classe représentant un point en 2D.
  */
class Point {

private:
    /// Coordonnée sur l'axe des abscisses
    p_type _x;
    /// Coordonnée sur l'axe des ordonnées
    p_type _y;
public:
    Point(const p_type x = 0, const p_type y = 0) : _x(x), _y(y) {}
    p_type x() const { return _x; };
    p_type y() const { return _y; };
    void set_x(const p_type x) { _x = x; };
    void set_y(const p_type y) { _y = y; };

    /**
      * Détermine si un point est sur le rayon horizontal droit issu d'un
      * autre point.
      * @param pt Point duquel est issu le rayon horizontal droit
      * @return \p true si le point est sur le rayon, \p false sinon.
      */
    bool is_on_radius(const Point* pt) const;

    friend bool operator==(const Point&, const Point&);
    friend bool operator<(const Point&, const Point&);
    friend std::ostream& operator<<(std::ostream&, const Point&);
};

#endif
